from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from apps.ai_chat.models import AIProvider, AIModel, AIRole, AIConversation, AIMessage
from apps.ai_chat.context_manager import ConversationContextManager

User = get_user_model()


class Command(BaseCommand):
    help = '演示滑动窗口上下文管理功能'

    def handle(self, *args, **options):
        self.stdout.write('开始演示滑动窗口上下文管理功能...\n')
        
        # 创建测试数据
        user = self.create_test_data()
        
        # 演示滑动窗口功能
        self.demo_sliding_window(user)
        
        self.stdout.write(
            self.style.SUCCESS('\n滑动窗口上下文管理演示完成！')
        )

    def create_test_data(self):
        """创建测试数据"""
        self.stdout.write('创建测试数据...')
        
        # 创建用户
        user, created = User.objects.get_or_create(
            username='demo_user',
            defaults={
                'email': 'demo@example.com',
                'password': 'demo123'
            }
        )
        
        # 创建AI提供商
        provider, created = AIProvider.objects.get_or_create(
            name='Demo Provider',
            owner=user,
            defaults={
                'provider_type': 'openai',
                'api_endpoint': 'https://api.openai.com/v1',
                'api_key': 'demo-key'
            }
        )
        
        # 创建AI模型
        model, created = AIModel.objects.get_or_create(
            provider=provider,
            model_code='gpt-4',
            defaults={
                'name': 'GPT-4',
                'max_tokens': 8192
            }
        )
        
        # 创建AI角色
        role, created = AIRole.objects.get_or_create(
            name='演示助手',
            created_by=user,
            defaults={
                'system_prompt': '你是一个有用的AI助手，专门用于演示上下文管理功能。请简洁地回答用户的问题。',
                'category': 'assistant'
            }
        )
        
        # 创建对话
        conversation, created = AIConversation.objects.get_or_create(
            title='滑动窗口演示对话',
            owner=user,
            defaults={
                'ai_model': model,
                'ai_role': role
            }
        )
        
        # 清除旧消息
        conversation.messages.all().delete()
        
        # 创建一系列对话消息
        topics = [
            "什么是人工智能？",
            "机器学习和深度学习的区别是什么？",
            "Python编程语言有什么特点？",
            "如何学习数据科学？",
            "什么是云计算？",
            "区块链技术的应用场景有哪些？",
            "前端开发需要掌握哪些技术？",
            "数据库设计的基本原则是什么？"
        ]
        
        for i, topic in enumerate(topics):
            # 用户消息
            user_msg = AIMessage.objects.create(
                conversation=conversation,
                content=topic,
                token_count=len(topic) // 2,  # 简单估算
                created_by=user
            )
            
            # AI回复
            ai_response = f"关于'{topic}'的问题，这是一个很好的技术问题。简单来说，这涉及到{['基础概念', '技术原理', '实践应用', '学习方法'][i % 4]}等方面。"
            ai_msg = AIMessage.objects.create(
                conversation=conversation,
                ai_role=role,
                content=ai_response,
                token_count=len(ai_response) // 2,  # 简单估算
                created_by=user
            )
        
        self.stdout.write(f'  ✓ 创建了 {len(topics) * 2} 条对话消息')
        return user

    def demo_sliding_window(self, user):
        """演示滑动窗口功能"""
        conversation = AIConversation.objects.get(
            title='滑动窗口演示对话',
            owner=user
        )
        
        context_manager = ConversationContextManager(conversation)
        
        self.stdout.write('\n=== 滑动窗口上下文管理演示 ===\n')
        
        # 演示1: 不同的消息数量限制
        self.stdout.write('1. 测试不同的消息数量限制:')
        for limit in [3, 5, 8]:
            context = context_manager.get_context_messages(
                message_limit=limit,
                token_limit=10000,
                include_system_prompt=True
            )
            
            self.stdout.write(f'   消息限制={limit}: 获取到 {context["window_size"]} 条消息, 总Token={context["total_tokens"]}')
        
        # 演示2: 不同的Token限制
        self.stdout.write('\n2. 测试不同的Token限制:')
        for token_limit in [100, 300, 500]:
            context = context_manager.get_context_messages(
                message_limit=20,  # 消息数量不限制
                token_limit=token_limit,
                include_system_prompt=True
            )
            
            self.stdout.write(f'   Token限制={token_limit}: 获取到 {context["window_size"]} 条消息, 总Token={context["total_tokens"]}')
        
        # 演示3: 显示实际的上下文内容
        self.stdout.write('\n3. 显示滑动窗口的实际内容 (最近3条消息):')
        context = context_manager.get_context_messages(
            message_limit=3,
            token_limit=10000,
            include_system_prompt=True
        )
        
        for i, msg in enumerate(context['context_messages']):
            role_display = {
                'system': '🤖 系统',
                'user': '👤 用户',
                'assistant': '🤖 助手'
            }.get(msg['role'], msg['role'])
            
            content = msg['content'][:50] + '...' if len(msg['content']) > 50 else msg['content']
            self.stdout.write(f'   {i+1}. {role_display}: {content} (Token: {msg["token_count"]})')
        
        # 演示4: AI API格式的上下文
        self.stdout.write('\n4. AI API格式的上下文 (最近2条消息):')
        api_messages = context_manager.get_context_for_ai_request(
            message_limit=2,
            token_limit=10000
        )
        
        for i, msg in enumerate(api_messages):
            role_display = {
                'system': '🤖 系统',
                'user': '👤 用户', 
                'assistant': '🤖 助手'
            }.get(msg['role'], msg['role'])
            
            content = msg['content'][:50] + '...' if len(msg['content']) > 50 else msg['content']
            self.stdout.write(f'   {i+1}. {role_display}: {content}')
        
        # 演示5: 缓存效果
        self.stdout.write('\n5. 测试缓存效果:')
        import time
        
        # 第一次调用（无缓存）
        start_time = time.time()
        context1 = context_manager.get_context_messages(message_limit=5, token_limit=10000)
        time1 = time.time() - start_time
        
        # 第二次调用（有缓存）
        start_time = time.time()
        context2 = context_manager.get_context_messages(message_limit=5, token_limit=10000)
        time2 = time.time() - start_time
        
        self.stdout.write(f'   第一次调用耗时: {time1:.4f}秒')
        self.stdout.write(f'   第二次调用耗时: {time2:.4f}秒 (缓存加速)')
        self.stdout.write(f'   缓存加速比: {time1/time2:.1f}x' if time2 > 0 else '   缓存加速比: 无限大')
        
        # 演示6: 滑动窗口的特点
        self.stdout.write('\n6. 滑动窗口特点总结:')
        self.stdout.write('   ✓ 自动选择最近的消息，保持对话连贯性')
        self.stdout.write('   ✓ 严格控制Token使用量，避免超出模型限制')
        self.stdout.write('   ✓ 支持灵活的消息数量和Token限制配置')
        self.stdout.write('   ✓ 使用缓存机制，提高响应速度')
        self.stdout.write('   ✓ 简单直接，无需复杂的压缩算法')
        self.stdout.write('   ✓ 保证上下文的时间顺序正确')
